// 12.1.2 模板的链接
// 模板的链接（linkage）涉及到模板如何在编译单元之间共享和解析：

// 模板的链接特性
// 1.内部链接与外部链接：
//      模板本身可以有内部链接（使用static关键字）或外部链接（默认）
// 外部链接（默认）
template <typename T>
class Widget
{ /*...*/
};

// 内部链接
static template <typename T>
class InternalWidget
{ /*...*/
}; // C++17之前不支持

// 2.模板实例化的链接：
//      模板实例化通常具有外部链接
//      多个编译单元中的同一模板实例会在链接时合并

// 显式实例化与链接
// 显式实例化声明可以控制模板在哪里实例化：
// 在一个.cpp文件中
template class Stack<int>; // 显式实例化定义

// 在其他.cpp文件中
extern template class Stack<int>; // 显式实例化声明，避免重复实例化

// 模板的单一定义规则（ODR）
// 1.模板定义必须一致：
//      在所有包含同一模板的编译单元中，模板定义必须完全相同
//      包括宏定义、预处理器条件等
// 2.实例化的一致性：
//      同一模板参数的实例化在整个程序中必须一致
//      链接器负责合并多个编译单元中的相同实例化

// 模板与内联
// 模板函数不自动内联，但通常在头文件中定义
// 可以显式使用inline关键字：
template <typename T>
inline T max(T a, T b)
{
    return a < b ? b : a;
}